<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>闭包</title>
</head>
<body>

<script>

  // 1. 闭包是Javascript的显著特征
  // 2. 闭包是纯函数式编程语言的特征
  // 3. 闭包是在一个函数创建时允许该自身函数访问并且操作该自身函数之外的变量时所创建的作用域。

</script>

<button id="b1">click me</button>
<script>
  // 举个例子
  function bind(context, name) {
    return function () {
      return context[name].apply(context, arguments);
    }
  }

  var button = {
    clicked: false,
    click() {
      this.clicked = true
      console.log(this)
    }
  }

  var elem = document.getElementById('b1');
  elem.addEventListener('click', bind(button, 'click'), false);

  // bind方法实现
  Function.prototype.bind = function () {
    // this -> 当前方法， args -> btn.bind(this, 'click') 复制出来的数组， object -> 传入的上下文
    let fn = this, args = Array.prototype.slice.call(arguments),
        object = args.shift()
    return function () {
      return fn.apply(object, args.concat(Array.prototype.slice.call(arguments)))
    }
  }

  // 访问内部变量机制
  function dd() {
    var c = 1;
    return function() {
      return c++;
    }
  }
  var m = dd()
  m();



</script>

</body>
</html>